package com.xavier.dong.netty.codec2;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.protobuf.ProtobufEncoder;

/**
 * @author XavierDong
 **/
public class NettyClient {

    public static void main(String[] args) throws InterruptedException {

        // 客户端 只需要一个 事件 循环组即可
        EventLoopGroup eventLoopGroup = new NioEventLoopGroup();

        try {
            // 创建 客户端 启动 对象
            // 客户端使用的 不是 ServerBootStrap 而是 BootStrap
            Bootstrap bootstrap = new Bootstrap();

            // 设置相关参数
            bootstrap.group(eventLoopGroup) // 设置 线程组
                    .channel(NioSocketChannel.class) // 设置 客户端通道 的 实现类
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            // 在 pipeline 加入 我们的 编码器
                            ch.pipeline().addLast("encoder", new ProtobufEncoder());
                            ch.pipeline().addLast(new NettyClientHandler());  // 加入 自己的 处理器
                        }
                    });

            System.out.println("客户端 is ok..");

            // 启动客户端 连接 服务器端
            // 关于 channel 要分析， 设计 Netty 的 异步模型
            ChannelFuture channelFuture = bootstrap.connect("localhost", 6668).sync();

            // 给 关闭通道 一个监听连接
            channelFuture.channel().closeFuture().sync();
        } finally {
            eventLoopGroup.shutdownGracefully();
        }
    }
}
